package modules.MenuManager;


import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import modules.MainModule;

import org.apache.log4j.Logger;
import org.nutz.dao.Cnd;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.sql.SqlCallback;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;

import common.tree.EasyUIForest;
import common.tree.EasyUITreeNode;

import dto.CD_Menu;

/**
 * 管理菜单模块
 * 
 * @author lost
 */
@IocBean
@At("/menuManager")
public class MenuManager extends MainModule {
	private static final Logger logger = Logger.getLogger(MenuManager.class) ;
	
	@At("/show")
	@Ok("jsp:/menuManager/menuManager.jsp")
	public String show() {
		return "";
	}
	@At("/query")
	public String query(@Param("id")int rootId){
		/**
		 * 如果外部没有传入到rootId则返回根节点下的节点
		 * 否则则返回rootId下的节点 
		 * 不传入的时候默认为0，则根节点为0
		 */
		Sql sql = dao.sqls().create("menuTree.query") ;
		sql.setCallback(new FillJSONArray());
		sql.params().set("parentId", rootId) ;
		//转换为easyui识别的格式
		dao.execute(sql) ;
		
		String res = sql.getResult().toString() ; 
		logger.info(res) ;
		return res ;
	}
	@At("/add")
	public String addNode(@Param("..") CD_Menu menu) {
		// 添加菜单
		String status = "添加成功";
		try {
			status = dao.insert(menu).getMenuId()+"";
		} catch (Exception e) {
			e.printStackTrace() ;
			status = "添加失败";
		}
		return status;
	}

	@At("/remove")
	public String remove(int menuId) {
		// 删除菜单
		String status = "删除成功";
		try {
			removeTree(menuId) ;
		} catch (Exception e) {
			e.printStackTrace() ;
			status = "删除失败";
		}
		return status;
	}
	
	private void removeTree(int rootId){
		List<CD_Menu> children = dao.query(CD_Menu.class, Cnd.where("parentId","=",rootId)) ;
		for(CD_Menu menu : children){
			removeTree(menu.getMenuId()) ;
		}
		dao.delete(CD_Menu.class, rootId) ;
	}

	@At("/modify")
	public String modify(@Param("..") CD_Menu menu) {
		// 修改菜单
		String status = "修改成功";
		try {
			dao.update(menu) ;
		} catch (Exception e) {
			e.printStackTrace() ;
			status = "修改失败";
		}
		return status;
	}
	//填充jsonarray对象的类
	private class FillJSONArray implements SqlCallback{
		@Override
		public Object invoke(Connection conn, ResultSet rs, Sql sql)
				throws SQLException {
			EasyUIForest forest = new EasyUIForest() ;
			while(rs.next()){
				EasyUITreeNode node = new EasyUITreeNode(rs.getInt("menuId"),rs.getString("menuname"));
				node.setMenuUrl(rs.getString("menuurl")) ;
				node.setDisplayNo(rs.getInt("displayNo")) ;
				node.setParentId(rs.getInt("parentId")) ;
				/**
				 * GIBBSFIXME 这里是有问题的，既然这个node代表叶子节点，那么就不应该存在开启和关闭状态
				 */
				if(rs.getInt("numbers")!=0)node.setState(EasyUITreeNode.STATE_CLOSED) ;
				forest.add(node) ;
			}
			return forest;
		}//end method 
	}//end private class
}//end out class